package modelo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.TreeMap;

public class DetalleOrdenDAO {
	private TreeMap<Pair<Integer, Integer>, DetalleOrden> elementos = new TreeMap<Pair<Integer, Integer>, DetalleOrden>();

	public DetalleOrdenDAO() {
		super();
	}
	
	public void cargar() {
		ArrayList<DetalleOrden> arr = Datos.getInstancia().leerBaseDatos("detalle_orden", new CreadorDato<DetalleOrden>() {
			@Override
			public DetalleOrden crear(ResultSet rs) throws SQLException {
				Orden or = Datos.getInstancia().getOrdenes().buscar(rs.getInt("orden"));
				Producto pro = Datos.getInstancia().getProductos().buscar(rs.getInt("producto"));
				return new DetalleOrden(or, pro, rs.getInt("cantidad"));
			}
		});
		
		for (DetalleOrden det : arr)
			elementos.put(new Pair<Integer, Integer>(det.getOrden().getCodigo(), det.getProducto().getCodigo()), det);
	}

	public DetalleOrden anadir(Orden or, Producto pr, int cantidad) {
		Conexion.ejecutar("INSERT INTO detalle_orden (orden, producto, cantidad) VALUES (" + or.getCodigo() + ", " + pr.getCodigo() + ", " + cantidad + ")");

		DetalleOrden det = new DetalleOrden(or, pr, cantidad);
		elementos.put(new Pair<Integer, Integer>(det.getOrden().getCodigo(), det.getProducto().getCodigo()), det);
		return det;
	}
	
	public void actualizar(DetalleOrden det) {
		String cadena = "UPDATE detalle_orden SET cantidad = " + det.getCantidad() + " WHERE orden = " + det.getOrden().getCodigo() + " AND producto = " + det.getProducto().getCodigo();
		Conexion.ejecutar(cadena);
	}
	
	public void eliminar(int orden, int producto) {
		String cadena = "DELETE FROM detalle_orden WHERE orden = " + orden + " AND producto = " + producto;
		Conexion.ejecutar(cadena);
		elementos.remove(new Pair<Integer, Integer>(orden, producto));
	}
	
	public DetalleOrden buscar(int orden, int producto) {
		return elementos.get(new Pair<Integer, Integer>(orden, producto));
	}
	
	public ArrayList<DetalleOrden> detallesGeneral() {
		return adjuntarObjeto(Conexion.consultar("SELECT orden, producto FROM detalle_orden"));
	}
	
	public ArrayList<DetalleOrden> detallesPorOrden(int orden) {
		return adjuntarObjeto(Conexion.consultar("SELECT orden, producto FROM detalle_orden WHERE orden = " + orden));
	}
	
	public ArrayList<DetalleOrden> detallesPorProducto(int producto) {
		return adjuntarObjeto(Conexion.consultar("SELECT orden, producto FROM detalle_orden WHERE producto = " + producto));
	}
	
	private ArrayList<DetalleOrden> adjuntarObjeto(ResultSet rs) {
		ArrayList<DetalleOrden> lst = new ArrayList<DetalleOrden>();
		
		try {
			while (rs.next()) lst.add(elementos.get(new Pair<Integer, Integer>(rs.getInt("orden"), rs.getInt("producto"))));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
}
